Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / tests / backend / test_plugin_integrity.py

Displaying Raw • Download


tests/backend/test_plugin_integrity.py HEAD (2bf00cb3) Text, 5.23 KB

T8b949e# SPDX-License-Identifier: 0BSD

Tff7b72import T7ee787json

Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787plugin_integrity Tff7b72import Te6edf3INTEGRITY_TAMPER_MESSAGE
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787plugin_manager Tff7b72import Te6edf3PluginManager


Tff7b72def Td2a8ff_install_simpleTb4b4b4(Te6edf3managerTb4b4b4, Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3source Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffsrcTa5d6ff"
Te6edf3sourceTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Tb4b4b4(Te6edf3source Tff7b72/ Ta5d6ff"Ta5d6ffplugin.jsonTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffwrite_textTb4b4b4(
Te6edf3jsonTff7b72.Td2a8ffdumpsTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffcom.example.integrityTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff1.0.0Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffapiVersionTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffIntegrityTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fffrontendTa5d6ff"Tb4b4b4: Tb4b4b4{Ta5d6ff"Ta5d6ffentryTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fffrontend/main.jsTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffjsTa5d6ff"Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3frontend Tff7b72= Te6edf3source Tff7b72/ Ta5d6ff"Ta5d6fffrontendTa5d6ff"
Te6edf3frontendTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Tb4b4b4(Te6edf3frontend Tff7b72/ Ta5d6ff"Ta5d6ffmain.jsTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffwrite_textTb4b4b4(Ta5d6ff"Ta5d6ffexport default Tffd700{}Ta5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72return Te6edf3managerTff7b72.Td2a8ffinstall_from_directoryTb4b4b4(Tffa657strTb4b4b4(Te6edf3sourceTb4b4b4)Tb4b4b4)


Tff7b72def Td2a8fftest_tamper_disables_and_reenable_refuses_without_reinstallTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787plugin_guard Tff7b72import Te6edf3PluginSecurityError

Te6edf3manager Tff7b72= Te6edf3PluginManagerTb4b4b4(Tffa657strTb4b4b4(Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffstorageTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3installed Tff7b72= Te6edf3_install_simpleTb4b4b4(Te6edf3managerTb4b4b4, Te6edf3tmp_pathTb4b4b4)
Te6edf3plugin_id Tff7b72= Te6edf3installedTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]
Te6edf3managerTff7b72.Td2a8ffenableTb4b4b4(Te6edf3plugin_idTb4b4b4)
Tff7b72assert Te6edf3managerTff7b72.Td2a8ffget_pluginTb4b4b4(Te6edf3plugin_idTb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6ffenabledTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True

Te6edf3target Tff7b72= Tb4b4b4(
Te6edf3tmp_path
Tff7b72/ Ta5d6ff"Ta5d6ffstorageTa5d6ff"
Tff7b72/ Ta5d6ff"Ta5d6ffpluginsTa5d6ff"
Tff7b72/ Ta5d6ff"Ta5d6ffinstalledTa5d6ff"
Tff7b72/ Te6edf3plugin_id
Tff7b72/ Ta5d6ff"Ta5d6fffrontendTa5d6ff"
Tff7b72/ Ta5d6ff"Ta5d6ffmain.jsTa5d6ff"
Tb4b4b4)
Te6edf3targetTff7b72.Td2a8ffwrite_textTb4b4b4(Ta5d6ff"Ta5d6ffexport default Ta5d6ff{Ta5d6fftampered:true}Ta5d6ff"Tb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)

Te6edf3reloaded Tff7b72= Te6edf3PluginManagerTb4b4b4(Tffa657strTb4b4b4(Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffstorageTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3view Tff7b72= Te6edf3reloadedTff7b72.Td2a8ffget_pluginTb4b4b4(Te6edf3plugin_idTb4b4b4)
Tff7b72assert Te6edf3view Tff7b72is Tff7b72not Tff7b72None
Tff7b72assert Te6edf3viewTb4b4b4[Ta5d6ff"Ta5d6ffenabledTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72False
Tff7b72assert Te6edf3viewTb4b4b4[Ta5d6ff"Ta5d6fftamperedTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3INTEGRITY_TAMPER_MESSAGE Tff7b72in Tb4b4b4(Te6edf3viewTb4b4b4[Ta5d6ff"Ta5d6ffauto_disabled_reasonTa5d6ff"Tb4b4b4] Tff7b72or Ta5d6ff"Ta5d6ff"Tb4b4b4)

Tff7b72tryTb4b4b4:
Te6edf3reloadedTff7b72.Td2a8ffenableTb4b4b4(Te6edf3plugin_idTb4b4b4)
Tff7b72raise Tf85149AssertionErrorTb4b4b4(Ta5d6ff"Ta5d6ffenable must refuse tampered plugin treesTa5d6ff"Tb4b4b4)
Tff7b72except Te6edf3PluginSecurityError Tff7b72as Te6edf3excTb4b4b4:
Tff7b72assert Ta5d6ff"Ta5d6fftamperedTa5d6ff" Tff7b72in Tffa657strTb4b4b4(Te6edf3excTb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Te6edf3still Tff7b72= Te6edf3reloadedTff7b72.Td2a8ffget_pluginTb4b4b4(Te6edf3plugin_idTb4b4b4)
Tff7b72assert Te6edf3stillTb4b4b4[Ta5d6ff"Ta5d6ffenabledTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72False
Tff7b72assert Te6edf3stillTb4b4b4[Ta5d6ff"Ta5d6fftamperedTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True


Te6edf3PYTHON_BACKEND Tff7b72= Ta5d6ff"""
Ta5d6ffdef invoke(method, args, host=None):
Ta5d6ff if method == Ta5d6ff"Ta5d6ffechoTa5d6ff"Ta5d6ff:
Ta5d6ff return Ta5d6ff{Ta5d6ff"Ta5d6ffechoTa5d6ff"Ta5d6ff: args.get(Ta5d6ff"Ta5d6ffvalueTa5d6ff"Ta5d6ff)}
Ta5d6ff raise ValueError(Ta5d6ff"Ta5d6ffunknownTa5d6ff"Ta5d6ff)

Ta5d6ffdef on_hook(hook, payload, host):
Ta5d6ff host.storage_set(Ta5d6ff"Ta5d6fflast_hookTa5d6ff"Ta5d6ff, hook)
Ta5d6ff return Ta5d6ff{Ta5d6ff"Ta5d6ffhookTa5d6ff"Ta5d6ff: hook}
Ta5d6ff"""


Tff7b72def Td2a8ff_install_pythonTb4b4b4(Te6edf3managerTb4b4b4, Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3source Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffpython-srcTa5d6ff"
Te6edf3sourceTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Tb4b4b4(Te6edf3source Tff7b72/ Ta5d6ff"Ta5d6ffplugin.jsonTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffwrite_textTb4b4b4(
Te6edf3jsonTff7b72.Td2a8ffdumpsTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffcom.example.integrity-pyTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ff1.0.0Ta5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffapiVersionTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4,
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffIntegrity PythonTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ffbackendTa5d6ff"Tb4b4b4: Tb4b4b4{Ta5d6ff"Ta5d6ffentryTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffbackend/main.pyTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fftypeTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffpythonTa5d6ff"Tb4b4b4}Tb4b4b4,
Ta5d6ff"Ta5d6ffpermissionsTa5d6ff"Tb4b4b4: Tb4b4b4{
Ta5d6ff"Ta5d6ffhooksTa5d6ff"Tb4b4b4: Tb4b4b4[Ta5d6ff"Ta5d6ffannounce.receivedTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffstorageTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffisolatedTa5d6ff"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)
Te6edf3backend Tff7b72= Te6edf3source Tff7b72/ Ta5d6ff"Ta5d6ffbackendTa5d6ff"
Te6edf3backendTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Tb4b4b4(Te6edf3backend Tff7b72/ Ta5d6ff"Ta5d6ffmain.pyTa5d6ff"Tb4b4b4)Tff7b72.Td2a8ffwrite_textTb4b4b4(Te6edf3PYTHON_BACKENDTb4b4b4, Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)
Tff7b72return Te6edf3managerTff7b72.Td2a8ffinstall_from_directoryTb4b4b4(
Tffa657strTb4b4b4(Te6edf3sourceTb4b4b4)Tb4b4b4,
Te6edf3granted_permissionsTff7b72=Tb4b4b4[Ta5d6ff"Ta5d6ffhooks:announce.receivedTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffstorage:isolatedTa5d6ff"Tb4b4b4]Tb4b4b4,
Tb4b4b4)


Tff7b72def Td2a8fftest_invoke_refuses_live_tamper_without_reinstallTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787plugin_guard Tff7b72import Te6edf3PluginSecurityError

Tff7b72class T56d364FakeAppTb4b4b4:
Te6edf3reticulum Tff7b72= Tffa657objectTb4b4b4(Tb4b4b4)
Te6edf3rnpath_handler Tff7b72= Tff7b72None
Te6edf3plugins_enabled Tff7b72= Tff7b72True

Te6edf3manager Tff7b72= Te6edf3PluginManagerTb4b4b4(Tffa657strTb4b4b4(Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffstorageTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3appTff7b72=Te6edf3FakeAppTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3installed Tff7b72= Te6edf3_install_pythonTb4b4b4(Te6edf3managerTb4b4b4, Te6edf3tmp_pathTb4b4b4)
Te6edf3plugin_id Tff7b72= Te6edf3installedTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]
Te6edf3managerTff7b72.Td2a8ffenableTb4b4b4(Te6edf3plugin_idTb4b4b4)
Tff7b72assert Te6edf3managerTff7b72.Td2a8ffinvokeTb4b4b4(Te6edf3plugin_idTb4b4b4, Ta5d6ff"Ta5d6ffechoTa5d6ff"Tb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffvalueTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4}Tb4b4b4)Tb4b4b4[Ta5d6ff"Ta5d6ffechoTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffokTa5d6ff"

Te6edf3target Tff7b72= Tb4b4b4(
Te6edf3tmp_path
Tff7b72/ Ta5d6ff"Ta5d6ffstorageTa5d6ff"
Tff7b72/ Ta5d6ff"Ta5d6ffpluginsTa5d6ff"
Tff7b72/ Ta5d6ff"Ta5d6ffinstalledTa5d6ff"
Tff7b72/ Te6edf3plugin_id
Tff7b72/ Ta5d6ff"Ta5d6ffbackendTa5d6ff"
Tff7b72/ Ta5d6ff"Ta5d6ffmain.pyTa5d6ff"
Tb4b4b4)
Te6edf3targetTff7b72.Td2a8ffwrite_textTb4b4b4(
Ta5d6ff"Ta5d6ffdef invoke(method, args, host=None):Tffea00\nTa5d6ff return Ta5d6ff{Ta5d6ff'Ta5d6ffechoTa5d6ff'Ta5d6ff: Ta5d6ff'Ta5d6ffpwnedTa5d6ff'Ta5d6ff}Tffea00\nTa5d6ff"Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)

Tff7b72tryTb4b4b4:
Te6edf3managerTff7b72.Td2a8ffinvokeTb4b4b4(Te6edf3plugin_idTb4b4b4, Ta5d6ff"Ta5d6ffechoTa5d6ff"Tb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffvalueTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffokTa5d6ff"Tb4b4b4}Tb4b4b4)
Tff7b72raise Tf85149AssertionErrorTb4b4b4(Ta5d6ff"Ta5d6ffinvoke must refuse a tampered plugin treeTa5d6ff"Tb4b4b4)
Tff7b72except Te6edf3PluginSecurityError Tff7b72as Te6edf3excTb4b4b4:
Tff7b72assert Ta5d6ff"Ta5d6fftamperedTa5d6ff" Tff7b72in Tffa657strTb4b4b4(Te6edf3excTb4b4b4)Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)
Te6edf3view Tff7b72= Te6edf3managerTff7b72.Td2a8ffget_pluginTb4b4b4(Te6edf3plugin_idTb4b4b4)
Tff7b72assert Te6edf3viewTb4b4b4[Ta5d6ff"Ta5d6ffenabledTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72False
Tff7b72assert Te6edf3viewTb4b4b4[Ta5d6ff"Ta5d6fftamperedTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True


Tff7b72def Td2a8fftest_dispatch_hook_skips_live_tamperTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Tff7b72class T56d364FakeAppTb4b4b4:
Te6edf3reticulum Tff7b72= Tffa657objectTb4b4b4(Tb4b4b4)
Te6edf3rnpath_handler Tff7b72= Tff7b72None
Te6edf3plugins_enabled Tff7b72= Tff7b72True

Te6edf3manager Tff7b72= Te6edf3PluginManagerTb4b4b4(Tffa657strTb4b4b4(Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffstorageTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3appTff7b72=Te6edf3FakeAppTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3installed Tff7b72= Te6edf3_install_pythonTb4b4b4(Te6edf3managerTb4b4b4, Te6edf3tmp_pathTb4b4b4)
Te6edf3plugin_id Tff7b72= Te6edf3installedTb4b4b4[Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4]
Te6edf3managerTff7b72.Td2a8ffenableTb4b4b4(Te6edf3plugin_idTb4b4b4)

Te6edf3target Tff7b72= Tb4b4b4(
Te6edf3tmp_path
Tff7b72/ Ta5d6ff"Ta5d6ffstorageTa5d6ff"
Tff7b72/ Ta5d6ff"Ta5d6ffpluginsTa5d6ff"
Tff7b72/ Ta5d6ff"Ta5d6ffinstalledTa5d6ff"
Tff7b72/ Te6edf3plugin_id
Tff7b72/ Ta5d6ff"Ta5d6ffbackendTa5d6ff"
Tff7b72/ Ta5d6ff"Ta5d6ffmain.pyTa5d6ff"
Tb4b4b4)
Te6edf3targetTff7b72.Td2a8ffwrite_textTb4b4b4(
Ta5d6ff"Ta5d6ffdef on_hook(hook, payload, host):Tffea00\nTa5d6ff host.storage_set(Ta5d6ff'Ta5d6fflast_hookTa5d6ff'Ta5d6ff, Ta5d6ff'Ta5d6ffpwnedTa5d6ff'Ta5d6ff)Tffea00\nTa5d6ff"Tb4b4b4,
Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4,
Tb4b4b4)

Te6edf3managerTff7b72.Td2a8ffdispatch_hookTb4b4b4(Te6edf3plugin_idTb4b4b4, Ta5d6ff"Ta5d6ffannounce.receivedTa5d6ff"Tb4b4b4, Tb4b4b4{Ta5d6ff"Ta5d6ffxTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4}Tb4b4b4)
Tff7b72assert Te6edf3managerTff7b72.Td2a8ffstorage_getTb4b4b4(Te6edf3plugin_idTb4b4b4, Ta5d6ff"Ta5d6fflast_hookTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72None
Te6edf3view Tff7b72= Te6edf3managerTff7b72.Td2a8ffget_pluginTb4b4b4(Te6edf3plugin_idTb4b4b4)
Tff7b72assert Te6edf3viewTb4b4b4[Ta5d6ff"Ta5d6ffenabledTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72False
Tff7b72assert Te6edf3viewTb4b4b4[Ta5d6ff"Ta5d6fftamperedTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────